/* Использование LCD функций для дисплеев, подключенных в режиме 
   отображения 8 битовой памяти */

/* Используется LCD 2x16, микроконтроллер AT90S8515.
   Схема подключения см. рис. 382 */ 

/* Определим символ пользователя и выведем его изображение на LCD */

#include <90s8515.h> 	// подключаем  заголовочный файл используемого 
					// микроконтроллера AVR

/* Теперь, перед использованием LCD функций для дисплеев, 
   подключенных в режиме отображения 8-битовой памяти, подключим 
   заголовочный файл lcdstk.h */ 
#include <lcdstk.h>

/* Определим тип данных byte
   byte==unsigned char */
typedef unsigned char byte;

/* Определим номер символа. Для примера определим символ с номером 4, т.е.
   он будет располагаться в ОЗУ знакогенератора (CGRAM) и его код будет 0x04 
   (см. табл. 61, стр. 477). 
   Всего можно определить 8 символов 0-7 с кодами 0x00-0x07 */
byte number_char=4;

/* Таблицу (массив) для определения символа пользователя (рожица, 
   см. рис. 372) для примера разместим в SRAM микроконтроллера
   (хотя можно и во FLASH памяти) */ 
byte char4[8]=
{0b00001110,
0b00010001,
0b00011011,
0b00010101,
0b00010001,
0b00010101,
0b00001110,
0b00000000};

/* Основная функция программы */

void main(void)
{
byte i; 			// определим переменную i, используемую
// как индекс
byte command_addr; 	// определим переменную command_addr,
// для хранения кода команды установки 
// адреса ячейки памяти  ОЗУ знакогенератора
// (CGRAM) (см. табл. 64, стр. 480)

/* инициализируем LCD 2x16 */
lcd_init(16);

/* Вычислим значение кода команды установки адреса самого младшего
   байта символа 4 в CGRAM
   Т.к. под каждый символ отводится 8 байт, то байты 0-го символа
   имеют адреса 0x00-0x07, байты 1-го - 0x08-0x0F, ... 
   байты n-го - (n*8) - (n*8+7)
   Т.е. чтобы получить адрес самого младшего байта символа, надо номер
   символа (нумерация начинается с 0) умножить на 8
   Чтобы получить код команды установки адреса в CGRAM, следует
   установить бит 6 в 1, а 7 - в 0 (см. табл. 64, стр. 480). Это можно 
   сделать, прибавив к адресу самого младшего байта символа число 
   0b01000000, т.к. для указания адреса ячеек CGRAM отводится 6-ть
   младших битов */

command_addr=(number_char*8)+0b01000000;

/* Перепишем значения таблицы для определения символа пользователя
   (char4[8]) в ячейки символа 4 CGRAM */

for (i=0; i<8; i++) 	// цикл for (см. "Оператор for", стр. 335)
{
/* Тело цикла for */
lcd_write_byte(command_addr++,char4[i]);
}

/* Установим курсор в начальную позицию LCD */
lcd_gotoxy(0,0);

/* Выведем строку */
lcd_putsf("Symbol number 4 of User: ");

/* Отобразим определенный ранее символ 4 пользователя */
lcd_putchar(4); 		// 4 - это код символа в CGRAM
// Можно записать 0x04 (см. табл. 61, стр. 477)

/* Обратите внимание, что этот символ дублируется еще и кодом 0x0C,
   т.е. символ также можно вывести командой:

   lcd_putchar(0x0C); */

/* Завершим программу бесконечным циклом */

while (1);
} 			// закрывающая скобка функции main
